#include "../edit/vararryt.h"
#include "UnitTest.h"

typedef CVarArrayT<int> CIntVarArray;

TEST_GROUP (TestVarArray)
{
}

TEST_CASE (TestVarArray, test_constructor)
{
    CIntVarArray arr(100);
    TEST_ASSERT (arr.GetCount() == 100);
    TEST_ASSERT (arr.GetArrayPtr() != NULL);

    int i = 0;
    int* parr = arr.GetArrayPtr();
    for (i = 0; i < 100; i++) {
        parr[i] = i;
    }
}

TEST_CASE (TestVarArray, test_array_pointer)
{
    CIntVarArray arr(100);
    TEST_ASSERT (arr.GetCount() == 100);
    TEST_ASSERT (arr.GetArrayPtr() != NULL);

    int i = 0;
    int* parr = arr.GetArrayPtr();
    for (i = 0; i < 100; i++) {
        parr[i] = i;
    }
    for (i = 0; i < 100; i++) {
        TEST_ASSERT (parr[i] == i);
        TEST_ASSERT (parr[i] == arr[i]);
    }
}

TEST_CASE (TestVarArray, test_cvararrayt_remove)
{
    CIntVarArray arr(100);
    
    int i = 0;
    int* parr = arr.GetArrayPtr();
    for (i = 0; i < 100; i++) {
        parr[i] = i;
    }
    arr.Remove(0,0);
    for (i = 0; i < 99; i++) {
        TEST_ASSERT(parr[i] == i+1);
    }
    TEST_ASSERT(parr[99] == 99);
    TEST_ASSERT (arr.GetCount() == 100);
    arr.Remove(98,98);
    for (i = 0; i < 98; i++) {
        TEST_ASSERT(parr[i] == i+1);
    }
    TEST_ASSERT(parr[98] == 99);
    TEST_ASSERT(parr[99] == 99);
    TEST_ASSERT (arr.GetCount() == 100);
    arr.Remove(99,99);
    for (i = 0; i < 98; i++) {
        TEST_ASSERT(parr[i] == i+1);
    }
    TEST_ASSERT(parr[98] == 99);
    TEST_ASSERT(parr[99] == 99);
    TEST_ASSERT (arr.GetCount() == 100);
    
    for (i = 0; i < 100; i++) {
        parr[i] = i;
    }
    arr.Remove(5,10);
    for (i = 5; i< 94; i++) {
        TEST_ASSERT (parr[i] == i+6);
    }
    TEST_ASSERT(parr[4] == 4);

}

TEST_CASE (TestVarArray, test_cvararray_insertat)
{
    CIntVarArray arr(10);
    int i;
    int additional[] = {11, 12, 13};

    for (i = 0; i < 10; i++) {
        arr[i] = i;
    }
    arr.InsertAt(4, 3, additional);
    for (i = 0; i < 4; i ++) {
        TEST_ASSERT (arr[i] == i);
    }
    TEST_ASSERT (arr[i++] == 11);
    TEST_ASSERT (arr[i++] == 12);
    TEST_ASSERT (arr[i++] == 13);
    for (; i < 10; i++) {
        TEST_ASSERT (arr[i] == i-3);
    }
}

TEST_CASE (TestVarArray, test_cvararrayt_resize)
{
    CIntVarArray arr(100);
    
    int i = 0;
    int* parr = arr.GetArrayPtr();
    for (i = 0; i < 100; i++) {
        parr[i] = i;
    }
    arr.Resize(200);
    parr = arr.GetArrayPtr();
    for (i = 0; i < 100; i++) {
        TEST_ASSERT (parr[i] == i);
    }
    arr.Resize(50);
    parr = arr.GetArrayPtr();
    for (i = 0; i < 50; i++) {
        TEST_ASSERT (parr[i] == i);
    }
}

TEST_CASE (TestVarArray, test_cvararrayt_detach)
{
    CIntVarArray arr(100);
    
    int i = 0;
    int* parr = arr.GetArrayPtr();
    for (i = 0; i < 100; i++) {
        parr[i] = i;
    }
    int* detach = arr.Detach();
    TEST_ASSERT (parr == detach);
    for (i = 0; i < 100; i++) {
        TEST_ASSERT (detach[i] == i);
    }
    TEST_ASSERT (arr.GetArrayPtr() == NULL)  ;  
}
